package com.unidentifiable.wechat.config;

import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import com.unidentifiable.wechat.accesstoken.AccessToken;
import com.unidentifiable.wechat.accesstoken.AccessTokenInfo;
import com.unidentifiable.wechat.util.MessageUtil;

import java.io.InputStream;
import java.util.Properties;

/**
 * AccessToken 配置类
 *
 * @author unidentifiable
 * @date 2021-02-28
 */
public class AccessTokenConfig {

    static {
        Properties prop = new Properties();
        String appid = null;
        String secret = null;
        try {
            // 读取 application.yml 获取微信开发者 appid 和 appsecret
            InputStream in = MessageUtil.class.getClassLoader().getResourceAsStream("application.yml");
            prop.load(in);
            appid = prop.getProperty("appid");
            secret = prop.getProperty("secret");
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 接口地址为https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET，其中grant_type固定写为client_credential即可。
        String url = String.format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s", appid, secret);
        // 此请求为https的get请求，返回的数据格式为{"access_token":"ACCESS_TOKEN","expires_in":7200}
        String result = HttpUtil.get(url);

        System.out.println("获取到的access_token=" + result);

        //使用FastJson将Json字符串解析成Json对象
        JSONObject json = new JSONObject(result);
        AccessToken token = new AccessToken();
        token.setTokenName(json.get("access_token", String.class));
        token.setExpireSecond(json.get("expires_in", Integer.class));

        // 开启一个线程，循环更新 AccessToken，该值有效期 2小时，需手动刷新
        new Thread(() -> {
            while (true) {
                try {
                    // 获取accessToken
                    AccessTokenInfo.accessToken = token;
                    // 获取成功
                    if (AccessTokenInfo.accessToken != null) {
                        // 获取到access_token 休眠7000秒,大约2个小时左右
                        Thread.sleep(7000 * 1000);
                    } else {
                        // 获取的access_token为空 休眠3秒
                        Thread.sleep(3000);
                    }
                } catch (Exception e) {
                    System.out.println("发生异常：" + e.getMessage());
                    e.printStackTrace();
                    try {
                        // 发生异常休眠1秒
                        Thread.sleep(1000);
                    } catch (Exception e1) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }

    public static void init(){

    }
}
